﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Net;
using System.Configuration;
using System.Xml;
using System.Xml.Linq;

namespace TireService.Website
{
    public partial class Test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        

        protected void Button1_Click(object sender, EventArgs e)
        {
            DateTime beginDate = Convert.ToDateTime("21-10-2013 10:00:00");
            DateTime endDate = Convert.ToDateTime("21-10-2013 12:30:00");

            string myLocation = "Mylius Erichsens Vej 50, 7400 Herning, Danmark";
            string mySubject = "Hjulskift på XY12456";
            string myDescription = "Vi kommer og skifter hjul på din bil.\n\nHUSK:\n\nLåsebolte og andet spændende...";

            // Initialize
            MemoryStream mStream = new MemoryStream();
            StreamWriter writer = new StreamWriter(mStream);
            writer.AutoFlush = true;

            // Create Header
            writer.WriteLine("BEGIN:VCALENDAR");
            writer.WriteLine("PRODID:-//MOBILHJULSKIFT.DK//www.mobilhjulskift.dk//EN");
            writer.WriteLine("BEGIN:VEVENT"); 
            
            // Create Body
            writer.WriteLine("DTSTART:" + beginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z") );
            writer.WriteLine("DTEND:" + endDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z") );
            writer.WriteLine("LOCATION:" + myLocation);
            writer.WriteLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" + myDescription);
            writer.WriteLine("SUMMARY:" + mySubject); 

            // Create Footer
            writer.WriteLine("PRIORITY:3");
            writer.WriteLine("END:VEVENT");
            writer.WriteLine("END:VCALENDAR"); 

            // Make it downloadable
            Response.Clear(); // clears the current output content from the buffer
            Response.AppendHeader("Content-Disposition", "attachment; filename=hjulskift.vcs");
            Response.AppendHeader("Content-Length", mStream.Length.ToString());
            Response.ContentType = "application/download";
            Response.BinaryWrite(mStream.ToArray());
            Response.End(); 


            //string primaryAddress = "Mylius Erichsens Vej 50, 7400 Herning, Danmark";
            //GMapGeocoder.Containers.Results from_coordinates = new GMapGeocoder.Containers.Results();
            //from_coordinates = GMapGeocoder.Util.Geocode(primaryAddress, "ABQIAAAAOqg0zdZdLRm2WH8lJpFDLxRBYr_GQowC8JJyghooYbwZzCFRqRS3_8Vqwz9Fzn2YR5-Z-atDW-OUxg"); //ConfigurationManager.AppSettings["MapKey"]);
            //float from_lat = (float)from_coordinates.Addresses[0].Coordinates.Latitude / 10000000;
            //float from_long = (float)from_coordinates.Addresses[0].Coordinates.Longitude / 10000000;

            //ABQIAAAAOqg0zdZdLRm2WH8lJpFDLxRBYr_GQowC8JJyghooYbwZzCFRqRS3_8Vqwz9Fzn2YR5-Z-atDW-OUxg
            //ABQIAAAAOqg0zdZdLRm2WH8lJpFDLxRBYr_GQowC8JJyghooYbwZzCFRqRS3_8Vqwz9Fzn2YR5-Z-atDW-OUxg
            //ABQIAAAA42JMAmIkiSl6Q71VDr-C_BRDg53x8M7Q5m4DWaI-LbkZLXViPRSirc7wa1Mf3DVjJPirbCrRCO0YAg


            //// Prepare meeting details
            //string schLocation = "Mylius Erichsens Vej 50, 7400 Herning";
            //string schSubject = "Hjulskift på bil - XX12345";
            //string schDescription = "Kære Jannik\n\nVi kommer her og skifter dine hjul\n\nVenlig hilsen\nMobilhjulskift.dk";
            //System.DateTime schBeginDate = Convert.ToDateTime("21-01-2013 10:00:00");
            //System.DateTime schEndDate = Convert.ToDateTime("21-01-2013 12:00:00");

            //// Put meeting details into a array of string
            //System.Text.StringBuilder iCal = new System.Text.StringBuilder();

            //// Mac
            //iCal.AppendLine("BEGIN:VCALENDAR");
            //iCal.AppendLine("PRODID:-//MOBILHJULSKIFT.DK//www.mobilhjulskift.dk//EN");
            //iCal.AppendLine("VERSION:2.0");
            //iCal.AppendLine("METHOD:REQUEST");
            //iCal.AppendLine("BEGIN:VEVENT");
            //iCal.AppendLine("DTSTART:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("DTEND:" + schEndDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("LOCATION:" + schLocation);
            //iCal.AppendLine("SUMMARY:" + schSubject);
            //iCal.AppendLine("DESCRIPTION:Hej Jannik.\n\nVi kan hermed bekræfte din tid hos Maja\n\nDenne aftale oplyser kun startstidspunkt for behandlingen, ikke varigheden.\n\nØnsker du en anden tid eller bliver du forhindret er du meget velkommen til at\nkontakte os på telefon: 97 21 23 77.\n\nMed venlig hilsen\nPoul M, Herning Centret\nMerkurvej 19\n\nBemærk!\nAfhængig af dine tidszone indstillinger i dit kalenderprogram kan tidspunktet angivet i denne aftale afvige. Kontroller derfor om tidspunktet er korrekt og stemmer overens med følgende: fredag d. 25-01-2013 kl. 16:45.");
            //iCal.AppendLine("UID:S-733352500D20130125T164500");
            //iCal.AppendLine("TRANSP:OPAQUE");
            //iCal.AppendLine("ACTION:DISPLAY");
            //iCal.AppendLine("PRIORITY:0");
            //iCal.AppendLine("CLASS:PRIVATE");
            //iCal.AppendLine("END:VEVENT");
            //iCal.AppendLine("END:VCALENDAR");

            //// Outlook
            //iCal.AppendLine("BEGIN:VCALENDAR");
            //iCal.AppendLine("PRODID:-//HAIRTOOLS//www.hairtools.dk//EN");
            //iCal.AppendLine("VERSION:2.0");
            //iCal.AppendLine("METHOD:PUBLISH");
            //iCal.AppendLine("BEGIN:VEVENT");
            //iCal.AppendLine("DTSTART:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("DTEND:" + schEndDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("DTSTAMP:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("LOCATION:" + schLocation);
            //iCal.AppendLine("SUMMARY:" + schSubject);
            //iCal.AppendLine("DESCRIPTION:Hej Jannik.\n\nVi kan hermed bekræfte din tid hos Maja\n\nDenne aftale oplyser kun startstidspunkt for behandlingen, ikke varigheden.\n\nØnsker du en anden tid eller bliver du forhindret er du meget velkommen til at\nkontakte os på telefon: 97 21 23 77.\n\nMed venlig hilsen\nPoul M, Herning Centret\nMerkurvej 19\n\nBemærk!\nAfhængig af dine tidszone indstillinger i dit kalenderprogram kan tidspunktet angivet i denne aftale afvige. Kontroller derfor om tidspunktet er korrekt og stemmer overens med følgende: fredag d. 25-01-2013 kl. 16:45.\n\nOplever du at de specielle danske bogstaver ikke vises korrekt skal du indstille karakterformatet til UTF-8, som er standard i Outlook, under import-indstillinger. Dette gælder bla. for Lotus Notes.");
            //iCal.AppendLine("UID:S-733336031D20130125T164500");
            //iCal.AppendLine("TRANSP:OPAQUE");
            //iCal.AppendLine("ACTION:DISPLAY");
            //iCal.AppendLine("PRIORITY:0");
            //iCal.AppendLine("CLASS:PRIVATE");
            //iCal.AppendLine("END:VEVENT");
            //iCal.AppendLine("END:VCALENDAR");

            //iCal.AppendLine("BEGIN:VCALENDAR");
            //iCal.AppendLine("PRODID:-//Mobilhjulskift.dk//EN");
            //iCal.AppendLine("BEGIN:VEVENT");
            //iCal.AppendLine("DTSTART:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("DTEND:" + schEndDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("LOCATION:" + schLocation);
            //iCal.AppendLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" + schDescription);
            //iCal.AppendLine("SUMMARY:" + schSubject);
            //iCal.AppendLine("PRIORITY:3");
            //iCal.AppendLine("END:VEVENT");
            //iCal.AppendLine("END:VCALENDAR");
            
            

            //System.Text.UTF8Encoding UTFencoding = new System.Text.UTF8Encoding();
            //byte[] outlook = UTFencoding.GetBytes(iCal.ToString());

            //Response.ContentType = "text/calendar";
            //Response.AddHeader("content-disposition","attachment; filename=HjulskiftBooking.vcs");
            //Response.Write(iCal);
            //Response.End();

            //MemoryStream mStream = new MemoryStream();
            //StreamWriter writer = new StreamWriter(mStream, System.Text.Encoding.GetEncoding(1252));
            //writer.AutoFlush = true;
            //// Outlook
            
            //writer.WriteLine("BEGIN:VCALENDAR");
            //writer.WriteLine("PRODID:-//HAIRTOOLS//www.hairtools.dk//EN");
            //writer.WriteLine("VERSION:2.0");
            //writer.WriteLine("METHOD:PUBLISH");
            //writer.WriteLine("BEGIN:VEVENT");
            //writer.WriteLine("DTSTART:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //writer.WriteLine("DTEND:" + schEndDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //writer.WriteLine("DTSTAMP:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //writer.WriteLine("LOCATION:" + schLocation);
            //writer.WriteLine("SUMMARY:" + schSubject);
            //writer.WriteLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:Hej Jannik.\n\nVi kan hermed bekræfte din tid hos Maja\n\nDenne aftale oplyser kun startstidspunkt for behandlingen, ikke varigheden.\n\nØnsker du en anden tid eller bliver du forhindret er du meget velkommen til at\nkontakte os på telefon: 97 21 23 77.\n\nMed venlig hilsen\nPoul M, Herning Centret\nMerkurvej 19\n\nBemærk!\nAfhængig af dine tidszone indstillinger i dit kalenderprogram kan tidspunktet angivet i denne aftale afvige. Kontroller derfor om tidspunktet er korrekt og stemmer overens med følgende: fredag d. 25-01-2013 kl. 16:45.\n\nOplever du at de specielle danske bogstaver ikke vises korrekt skal du indstille karakterformatet til UTF-8, som er standard i Outlook, under import-indstillinger. Dette gælder bla. for Lotus Notes.");
            //writer.WriteLine("UID:S-733336031D20130125T164500");
            //writer.WriteLine("TRANSP:OPAQUE");
            //writer.WriteLine("ACTION:DISPLAY");
            //writer.WriteLine("PRIORITY:0");
            //writer.WriteLine("CLASS:PRIVATE");
            //writer.WriteLine("END:VEVENT");
            //writer.WriteLine("END:VCALENDAR");

            //Response.Clear(); //clears the current output content from the buffer
            //Response.AppendHeader("Content-Disposition", "attachment; filename=Add2Calendar.vcs");
            //Response.AppendHeader("Content-Length", mStream.Length.ToString());
            //Response.ContentType = "application/download";
            //Response.BinaryWrite(mStream.ToArray());
            //Response.End(); 


            //// Put meeting details into a array of string
            //System.Text.StringBuilder iCal = new System.Text.StringBuilder();

            //iCal.AppendLine("BEGIN:VCALENDAR");
            //iCal.AppendLine("PRODID:-//MOBILHJULSKIFT.DK//www.mobilhjulskift.dk//EN");
            //iCal.AppendLine("VERSION:2.0");
            //iCal.AppendLine("METHOD:REQUEST");
            //iCal.AppendLine("BEGIN:VEVENT");
            //iCal.AppendLine("DTSTART:" + schBeginDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("DTEND:" + schEndDate.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            //iCal.AppendLine("LOCATION:" + schLocation);
            //iCal.AppendLine("SUMMARY:" + schSubject);
            //iCal.AppendLine("DESCRIPTION:Hej Jannik.\n\nVi kan hermed bekræfte din tid hos Maja\n\nDenne aftale oplyser kun startstidspunkt for behandlingen, ikke varigheden.\n\nØnsker du en anden tid eller bliver du forhindret er du meget velkommen til at\nkontakte os på telefon: 97 21 23 77.\n\nMed venlig hilsen\nPoul M, Herning Centret\nMerkurvej 19\n\nBemærk!\nAfhængig af dine tidszone indstillinger i dit kalenderprogram kan tidspunktet angivet i denne aftale afvige. Kontroller derfor om tidspunktet er korrekt og stemmer overens med følgende: fredag d. 25-01-2013 kl. 16:45.");
            //iCal.AppendLine("UID:S-733352500D20130125T164500");
            //iCal.AppendLine("TRANSP:OPAQUE");
            //iCal.AppendLine("ACTION:DISPLAY");
            //iCal.AppendLine("PRIORITY:0");
            //iCal.AppendLine("CLASS:PRIVATE");
            //iCal.AppendLine("END:VEVENT");
            //iCal.AppendLine("END:VCALENDAR");
        }
    }

    public class GoogleAPI
    {
    }


    public class LatLng
    {
        public double Latitude { get; set; }
        public double Longitude { get; set; }

        public LatLng() { }

        public LatLng(double lat, double lng)
        {
            this.Latitude = lat;
            this.Longitude = lng;
        }
    }

    public class GoogleMaps
    {
        private string API_KEY = string.Empty;

        public GoogleMaps(string api_key)
        {
            this.API_KEY = api_key;
        }

        public void SetApiKey(string key)
        {
            if (key == null | key == "" | key == string.Empty)
            {
                throw new ArgumentException("API Key is invalid");
            }

            this.API_KEY = key;
        }

        public LatLng GetLatLng(string addr)
        {
            // Version 2.0 - Return CSV. OUTDATED: 9/9-2013
            //var url = "http://maps.google.co.uk/maps/geo?output=csv&key=" + this.API_KEY + "&q=" + HttpContext.Current.Server.UrlEncode(addr);
            
            // Version 3.0 - Return XML - DOC: https://developers.google.com/maps/documentation/geocoding/
            var url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + addr + "&sensor=false";
            try
            {
                XElement GoogFile = XElement.Load(url);
                var location = GoogFile.Descendants("location").First();
                var lat = location.Element("lat");
                var lng = location.Element("lng");

                return new LatLng(Convert.ToDouble(lat.Value), Convert.ToDouble(lng.Value));
            }
            catch (Exception ex)
            {
                string t = ex.Message;
                return null;
            }
            

            //var request = WebRequest.Create(url);
            //var response = (HttpWebResponse)request.GetResponse();

            //if (response.StatusCode == HttpStatusCode.OK)
            //{
            //    var ms = new MemoryStream();
            //    var responseStream = response.GetResponseStream();

            //    var buffer = new Byte[2048];
            //    int count = responseStream.Read(buffer, 0, buffer.Length);

            //    while (count > 0)
            //    {
            //        ms.Write(buffer, 0, count);
            //        count = responseStream.Read(buffer, 0, buffer.Length);
            //    }

            //    responseStream.Close();
            //    ms.Close();

            //    var responseBytes = ms.ToArray();
            //    var encoding = new System.Text.ASCIIEncoding();




            //    var coords = encoding.GetString(responseBytes);
            //    var parts = coords.Split(',');


            //    XmlDocument xmlDoc = new XmlDocument();
            //    xmlDoc.Load(ms);
            //    XmlNodeList address = xmlDoc.GetElementsByTagName("original");


            //    return new LatLng(Convert.ToDouble(parts[2]), Convert.ToDouble(parts[3]));
            //}

            //return null;
        }

        /// <summary>
        /// Helper function that returns longitude and latitude coordinates for a specific address from google maps 
        /// </summary>
        /// <param name="Address">Address to return coordinates for</param>
        /// <returns>Double array with longitude and latitude</returns>
        public double[] GetLongLatCoordinates(string Address)
        {
            double[] LongLatCoordinates = new double[2];

            LatLng latlng = GetLatLng(Address);
            LongLatCoordinates[0] = latlng.Longitude / 10000000;
            LongLatCoordinates[1] = latlng.Latitude / 10000000;

            return LongLatCoordinates;
        }
    }

}